#include "stdDataBase.h"
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>


#define BUFFER_SIZE 128
/* 查询用户是否存在数据库中 */
bool userInfoIsRegistered(UserInfo *info)
{
    /* 为了节省时间, 减少IO操作. 在内存中维护了一套用户表信息 */
    /* todo... */

    /* 数据库句柄 */
    sqlite3 * myDB = NULL;
    
    const char * filename = "./chatroom.db";
    /* 打开指定的数据库文件，并将数据库连接句柄保存在 myDB 变量中。 */
    int ret = sqlite3_open(filename, &myDB);
    if (ret != SQLITE_OK)
    {
        /* 连接不成功 */
        printf("sqlite3_open error:%s\n", sqlite3_errmsg(myDB));
        exit(-1);
    }

    /* 注册功能 - 需求: 看用户是否存在 */
    const char * sql = "select count(*) from userInfo where username = '%s';";

    /* 格式化字符串 */
    char requestSql[BUFFER_SIZE] = { 0 };
    /* 将用户名插入到 SQL 查询语句中，得到完整的查询语句。 */
    sprintf(requestSql, sql, info->username);
    
    /* 结果集 */
    char **result = NULL;
    ret = sqlite3_get_table(myDB, sql, &result, NULL, NULL, NULL);
    if (ret != SQLITE_OK)
    {
        printf("sqlite3_get_table error");
        exit(-1);
    }
    /* 得到的结果存在结果集合中. */
    /* 将查询结果转换为整数，并存储在 isExist 变量中。
        这里假设结果集中的第二行第一列是记录数量，用于判断用户是否存在。 */
    int isExist = strtol(result[1], NULL, 0);

    /* 强制转换成bool类型 */
    return (bool)isExist;
}
    
/* 保存用户到数据库中 */
int saveUserInfo(UserInfo *info)
{
    /* 数据库句柄 */
    sqlite3 *myDB = NULL;
    
    const char *filename = "./chatroom.db";
    /* 打开指定的数据库文件，并将数据库连接句柄保存在 myDB 变量中。 */
    int ret = sqlite3_open(filename, &myDB);
    if (ret != SQLITE_OK)
    {
        /* 连接不成功 */
        printf("sqlite3_open error:%s\n", sqlite3_errmsg(myDB));
        exit(-1);
    }

    /* 准备 SQL 语句 */
    /* 用于指定要插入数据的表名、字段名和要插入的值。 */
    const char *sql = "INSERT INTO userInfo (username, passwd, ...) VALUES (?, ?, ...)";
    sqlite3_stmt *stmt;
    ret = sqlite3_prepare_v2(myDB, sql, -1, &stmt, NULL);
    if (ret != SQLITE_OK)
    {
        printf("sqlite3_prepare_v2 error:%s\n", sqlite3_errmsg(myDB));
        sqlite3_close(myDB);
        return -1;
    }

    /* 绑定参数:用于将文本类型的参数绑定到 SQL 语句中的占位符上 */
    sqlite3_bind_text(stmt, 1, info->username, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 2, info->passwd, -1, SQLITE_STATIC);
    /* 继续绑定其他参数... */

    /* 执行 SQL 语句 */
    ret = sqlite3_step(stmt);
    if (ret != SQLITE_DONE)
    {
        printf("sqlite3_step error:%s\n", sqlite3_errmsg(myDB));
        sqlite3_finalize(stmt);
        sqlite3_close(myDB);
        return -1;
    }

    /* 释放资源 */
    sqlite3_finalize(stmt);
    sqlite3_close(myDB);

    return ON_SUCCESS;  // 返回成功状态码

}